# 作者: 陈其志 
# 2025年02月20日22时59分39秒 
# 2716847110@qq.com
# 单例模式，是最简单的设计模式，还有工厂模式，装饰器模式等

# 单例模式的基本原理:音乐播放，打印机，回收站。只需要一个，不需要多个
class MusicPlayer(object):
    # 重写new，new在init之前，是用来分配空间，返回对象的引用
    def __new__(cls, *args, **kwargs):
        # 1、创建对象是，new方法会被自动调用
        print(f"创建对象，分配空间")
        # 2、为对应的对象分配空间
        instance = super().__new__(cls)  # 必须调用这个才有空间，object类的__new__
        # 3、返回
        return instance

    def __init__(self):
        print('播放器初始化')


# 这个是单例模式，用instance来存储分配的地址，使得每次实例化对象都会覆盖
class AppPlayer(object):
    """
    单例模式的作用，第二次实例化对象得到的对象仍然和第一次相同
    """
    # 创建类属性来保存地址，使得多次创建对象的空间在一个位置
    instance = None

    def __new__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super().__new__(cls)  # 必须调用这个才有空间，object类的__new__也就是基类的__new__
        # 3、返回
        return cls.instance  # 必须返回，重写new必须返回，固定写法

    def __init__(self, name):
        self.name = name
        print(f'播放器初始化:{self.name}')


if __name__ == '__main__':
    player1 = MusicPlayer()  # cls.instance = player1的地址
    player2 = MusicPlayer()
    print(id(player1))
    print(id(player2))
    print(f'-' * 50)
    app1 = AppPlayer('稻香')
    app2 = AppPlayer('爱在西元前')
    print(id(app1))
    print(id(app2))
